/*
 * Copyright (c) 2019. ascend 版权所有禁止转载。
 */

package cn.edu.zua.demo07.core;

import cn.edu.zua.demo07.entity.MailEntity;
import cn.edu.zua.demo07.enumeration.MailContentTypeEnum;
import cn.edu.zua.demo07.util.PropertyUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.PropertiesUtil;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Properties;

/**
 * 说明：
 *
 * @author ascend
 * 2019/1/24 9:37
 */
public class MailSender {
    private MailEntity mail = new MailEntity();

    /**
     * 设置邮件标题
     * @param title 标题
     * @return 设置标题后的邮件
     */
    public MailSender setTitle(String title) {
        mail.setTitle(title);
        return this;
    }

    /**
     * 设置邮件内容
     * @param content 内容
     * @return 设置内容后的邮件
     */
    public MailSender setContent(String content) {
        mail.setContent(content);
        return this;
    }

    /**
     * 设置邮件内容格式
     * @param mailContentTypeEnum 内容格式枚举
     * @return 设置邮件内容格式后的邮件
     */
    public MailSender setContentType(MailContentTypeEnum mailContentTypeEnum) {
        mail.setContentType(mailContentTypeEnum.getValue());
        return this;
    }

    /**
     * 设置目标邮件地址列表
     * @param targetList 目标邮件地址列表
     * @return 设置目标邮件地址列表后的邮件
     */
    public MailSender setTargets(List<String> targetList) {
        mail.setList(targetList);
        return this;
    }

    /**
     * 发送邮件
     */
    public void send() throws UnsupportedEncodingException, MessagingException {
        //默认使用html内容发送
        if(mail.getContentType() == null) {
            mail.setContentType(MailContentTypeEnum.HTML.getValue());
        }

        if(StringUtils.isBlank(mail.getTitle())) {
            throw new IllegalArgumentException("邮件标题没有设置.调用title方法设置");
        }

        if(StringUtils.isBlank(mail.getContent())) {
            throw new IllegalArgumentException("邮件内容没有设置.调用content方法设置");
        }

        if(CollectionUtils.isEmpty(mail.getList())) {
            throw new IllegalArgumentException("没有接受者邮箱地址.调用targets方法设置");
        }

        //读取/resource/mail_zh_CN.properties文件内容
        final PropertyUtils properties = new PropertyUtils("mail");
        // 创建Properties 类用于记录邮箱的一些属性
        final Properties props = new Properties();
        // 表示SMTP发送邮件，必须进行身份验证
        props.put("mail.smtp.auth", "true");
        //此处填写SMTP服务器
        props.put("mail.smtp.host", properties.getValue("mail.smtp.service"));
        //设置端口号，QQ邮箱给出了两个端口465/587
        props.put("mail.smtp.port", properties.getValue("mail.smtp.prot"));
        // 设置发送邮箱
        props.put("mail.user", properties.getValue("mail.from.address"));
        // 设置发送邮箱的16位STMP口令
        props.put("mail.password", properties.getValue("mail.from.smtp.pwd"));

        // 构建授权信息，用于进行SMTP进行身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 用户名、密码
                String userName = props.getProperty("mail.user");
                String password = props.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };
        // 使用环境属性和授权信息，创建邮件会话
        Session mailSession = Session.getInstance(props, authenticator);
        // 创建邮件消息
        MimeMessage message = new MimeMessage(mailSession);
        // 设置发件人
        String nickName = MimeUtility.encodeText(properties.getValue("mail.from.nickname"));
        InternetAddress form = new InternetAddress(nickName + " <" + props.getProperty("mail.user") + ">");
        message.setFrom(form);

        // 设置邮件标题
        message.setSubject(mail.getTitle());
        //html发送邮件
        if(mail.getContentType().equals(MailContentTypeEnum.HTML.getValue())) {
            // 设置邮件的内容体
            message.setContent(mail.getContent(), mail.getContentType());
        }
        //文本发送邮件
        else if(mail.getContentType().equals(MailContentTypeEnum.TEXT.getValue())){
            message.setText(mail.getContent());
        }
        //发送邮箱地址
        List<String> targets = mail.getList();
        for(int i = 0;i < targets.size();i++){
            try {
                // 设置收件人的邮箱
                InternetAddress to = new InternetAddress(targets.get(i));
                message.setRecipient(Message.RecipientType.TO, to);
                // 最后当然就是发送邮件啦
                Transport.send(message);
            }catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}
